/**
 * @file gjson.h
 * @brief json analyzer based on glib
 * @author JakeYang <add358@gmail.com>
 * @version 0.1
 * @date 2016-02-24
 */

#ifndef __GJSON_H__
#define __GJSON_H__

#include "gjson_object.h"
#include "gjson_array.h"

G_BEGIN_DECLS

typedef GJsonObject GJson;

/**
 * @brief g_json_parse_file 解析json文件
 * @param filename          json文件
 * @return  成功返回GJson类型数据， 失败返回NULL
 */
extern GJson* g_json_parse_file(const gchar *filename);

/**
 * @brief g_json_parse_data 解析json数据
 * @param value             json数据
 * @return  成功返回GJson类型数据， 失败返回NULL
 */
extern GJson* g_json_parse_data(gchar *data);

/**
 * @brief g_json_destory    销毁GJson对象
 * @param json              指向GJson类型数据
 */
extern void g_json_destroy(GJson *json);

/**
 * @brief g_json_get_object 获取json的object数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @return 成功返回object对象， 失败返回NULL
 */
extern GJson* g_json_get_object(GJson *json, const gchar *str);

/**
 * @brief g_json_get_array  获取json的array数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @return 成功返回array对象， 失败返回NULL
 */
extern GJsonArray* g_json_get_array(GJson *json, const gchar *str);

/**
 * @brief g_json_get_string 获取json的字符串数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @return  成功返回字符串，失败返回NULL
 */
extern gchar* g_json_get_string(GJson *json, const gchar *str);

/**
 * @brief g_json_get_int    获取json的整型数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @param err               出错时保存出错信息
 * @return 成功返回整型数据，失败时返回0且参数err不为NULL
 */
extern gint g_json_get_int(GJson *json, const gchar *str, GError **err);

/**
 * @brief g_json_get_int    获取json的浮点型数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @param err               出错时保存出错信息
 * @return 成功返回浮点型数据，失败时返回0且参数err不为NULL
 */
extern gdouble g_json_get_double(GJson *json, const gchar *str, GError **err);

/**
 * @brief g_json_get_int    获取json的布尔型数据
 * @param json              指向GJson类型数据
 * @param str               键名称
 * @param err               出错时保存出错信息
 * @return 成功返回布尔型数据，失败时返回FALSE且参数err不为NULL
 */
extern gboolean g_json_get_gboolean(GJson *json, const gchar *str, GError **err);


/**
 * @brief g_json_show   显示json数据
 * @param json          指向GJson类型数据
 * @return 成功返回打印字符串，失败返回NULL；返回的指针需要手动释放
 */
extern gchar* g_json_print(GJson *json);

G_END_DECLS

#endif /* end of include guard */
